package com.ht.module.file.controller;

import com.alibaba.fastjson.JSONObject;

import com.ht.config.onlyoffcie.FileConfigDTO;
import com.ht.module.file.entity.FileInfo;
import com.ht.module.file.service.FileInfoService;
import com.ht.module.file.service.OnlyOfficeService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
import java.util.Scanner;

/**
 * @ClassName OnlyOfficeController
 * @Description TODO（onlyoffcie控制层）
 * @Author hejialun
 * @Date 2024/06/14 14:49
 * @Version 1.0
 */
@RestController
@Slf4j
@RequestMapping("/onlyOffice")
public class OnlyOfficeController {

    @Resource
    private OnlyOfficeService onlyOfficeService;
    @Resource
    private FileInfoService fileInfoService;

    /**
     * 预览
     */
    @GetMapping("/view/{fileId}")
    public ModelAndView view(@PathVariable("fileId") String fileId, Model model) {
        FileInfo fileInfo = fileInfoService.getById(fileId);
        return onlyOfficeService.viewBuild(fileInfo,model);
    }



    /**
     * 预览
     */
    @GetMapping("/edit/{fileId}")
    public ModelAndView edit(@PathVariable("fileId") String fileId, Model model) {
        FileInfo fileInfo = fileInfoService.getById(fileId);
        return onlyOfficeService.editBuild(fileInfo,model);
    }



    /**
     * 文档编辑服务使用JavaScript API通知callbackUrl，向文档存储服务通知文档编辑的状态。
     * 文档编辑服务使用具有正文中的信息的POST请求。
     * https://api.onlyoffice.com/editors/callback
     * <p>
     * 当我们关闭编辑窗口后，十秒钟左右only office会将它存储的我们的编辑后的文件
     */
    @PostMapping("/save")
    public void saveFile(HttpServletRequest request, HttpServletResponse response) {
        PrintWriter writer = null;
        log.info("开始保存文档数据");
        try {
            writer = response.getWriter();
            // 获取传输的json数据
            Scanner scanner = new Scanner(request.getInputStream()).useDelimiter("\\A");
            String body = scanner.hasNext() ? scanner.next() : "";
            JSONObject jsonObject = JSONObject.parseObject(body);
            onlyOfficeService.handlerStatus(jsonObject);
        } catch (Exception e) {
            e.printStackTrace();
        }
        /*
         * status = 1，我们给onlyOffice的服务返回{"error":"0"}的信息。
         * 这样onlyOffice会认为回调接口是没问题的，这样就可以在线编辑文档了，否则的话会弹出窗口说明
         */
        if (Objects.nonNull(writer)) {
            writer.write("{\"error\":0}");
        }
    }

}
